class Solution {
    // public String convert(String s, int numRows) {
    //     // 当只有一行或者只有一列时，直接返回结果即可
    //     if (numRows == 1 || numRows >= s.length()) {
    //         return s;
    //     }
    //     // 1、做准备工作
    //     char[] str = s.toCharArray();
    //     char[][] ch = new char[numRows][1000];
    //     // Arrays.fill(ch, '*'); 这里不能直接去填充，fill方法只能填充一维数组
    //     // 2、遍历字符串填充数组
    //     int index = 0;
    //     int len = str.length;
    //     int i = 0;
    //     int j = 0;
    //     while (index < len) {
    //         while (i < numRows-1) {
    //             if (index < len) {
    //                 ch[i++][j] = str[index++];
    //             } else {
    //                 break;
    //             }
    //         }
    //         while (i > 0) {
    //             if (index < len) {
    //                 ch[i--][j++] = str[index++];
    //             } else {
    //                 break;
    //             }
    //         }
    //     }
    //     // 3、从数组中拿值，拼凑字符串
    //     StringBuilder sb = new StringBuilder();
    //     for (i = 0; i < numRows; i++) {
    //         for (j = 0; j < 1000; j++) {
    //             if (ch[i][j] != '\u0000') {
    //                 sb.append(ch[i][j]);
    //             }
    //         }
    //     }
    //     return sb.toString();
    // }

    public String convert(String s, int numRows) {
        // 当只有一行或者只有一列时，直接返回结果即可
        if (numRows == 1 || numRows > s.length()) {
            return s;
        }
        StringBuilder sb = new StringBuilder();
        int d = 2 * numRows - 2;
        int len = s.length();
        // 按照从上到下的顺序直接来计算
        // 第一行
        for (int i = 0; i < len; i += d) {
            sb.append(s.charAt(i));
        }
        // 中间行
        for (int k = 1; k < numRows-1; k++) { // k是行数
            // i 是前一个，j 是后一个，只要两者有一个是小于len的，就需要进入循环
            for (int i = k, j = d-k; i < len || j < len; i += d, j += d) {
                // 这里的顺序只能是先i后j
                if (i < len) {
                    sb.append(s.charAt(i));
                }
                if (j < len) {
                    sb.append(s.charAt(j));
                }
            }
        }
        // 最后一行
        for (int i = numRows-1; i < len; i += d) {
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }
}